package com.bbva.itradecomex.controller.vistaCliente;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import com.bbva.itradecomex.bo.iface.RelacionBancoBO;
import com.bbva.itradecomex.controller.ComunController;
import com.bbva.itradecomex.domain.ClienteRelacionBancoResultado;
import com.bbva.itradecomex.form.RelacionBancoBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;


@Controller
@RequestScoped
@ManagedBean
public class RelacionBancoController {
	private static final Logger log = Logger.getLogger(RelacionBancoController.class);
	@Autowired
	RelacionBancoBO relacionBancoBO;
	
	private List<ClienteRelacionBancoResultado> listaCBancoResultadoImportaciones;
	private List<ClienteRelacionBancoResultado> listaCBancoResultadoExportaciones;
	private List<ClienteRelacionBancoResultado> listaCBancoResultadoImpoExpo;
	
	ClienteRelacionBancoResultado subTotalBancoConClaveImp;
	ClienteRelacionBancoResultado subTotalBancoSinClaveImp;
	ClienteRelacionBancoResultado totalBancoImp;
	
	ClienteRelacionBancoResultado subTotalBancoConClaveExp;
	ClienteRelacionBancoResultado subTotalBancoSinClaveExp;
	ClienteRelacionBancoResultado totalBancoExp;
	
	ClienteRelacionBancoResultado subTotalBancoConClaveImpExp;
	ClienteRelacionBancoResultado subTotalBancoSinClaveImpExp;
	ClienteRelacionBancoResultado totalBancoImpExp;

	RelacionBancoBusquedaForm busquedaForm;
	
	Integer idxTabResult;

	
	public void onPageLoad(ComponentSystemEvent event){
		try {
			if(!FacesContext.getCurrentInstance().isPostback()){
				//Limpiar
				System.out.println("ingres a !isPostBack...");
				this.listaCBancoResultadoImportaciones=null;
				this.listaCBancoResultadoExportaciones=null;
				this.listaCBancoResultadoImpoExpo=null;
				this.subTotalBancoConClaveImp = null;
				this.subTotalBancoSinClaveImp=null;
				this.totalBancoImp=null;
				
				this.subTotalBancoConClaveExp=null;
				this.subTotalBancoSinClaveExp=null;
				this.totalBancoExp=null;
				
				this.subTotalBancoConClaveImpExp=null;
				this.subTotalBancoSinClaveImpExp=null;
				this.totalBancoImpExp=null;
				
				this.busquedaForm = new RelacionBancoBusquedaForm();

				Calendar cal = Calendar.getInstance();
				cal.set(Calendar.YEAR, cal.get(Calendar.YEAR));
				cal.set(Calendar.MONTH, 0);
				cal.set(Calendar.DAY_OF_MONTH, 1);
				busquedaForm.setDtFechaIni(cal.getTime());
				busquedaForm.setDtFechaFin(Calendar.getInstance().getTime());
				
				this.cargarDatos();
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	public void validaRangoFechas(DateSelectEvent event) { 
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
    }

	public void validateDateChange(AjaxBehaviorEvent event){
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
	}
	public void cargarDatos() throws Exception{
		ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
				.getBean("comunController");
		comunController.inicializarValores();
		comunController.cargarExclusividadAladi();
		comunController.cargarExclusividadBancos();
		comunController.cargarExclusividadBancosClave();
	}
	public String exportPDFRankingBancos(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoImportaciones(), this.getBusquedaForm(),this.getTotalBancoImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 1://EXPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoExportaciones(), this.getBusquedaForm(),this.getTotalBancoExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 2://IMPORTACIONES Y EXPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoImpoExpo(), this.getBusquedaForm(),this.getTotalBancoImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}
	public String exportXLSRankingBancos(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoImportaciones(), this.getBusquedaForm(),this.getTotalBancoImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 1://EXPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoExportaciones(), this.getBusquedaForm(),this.getTotalBancoExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 2://IMPORTACIONES Y EXPORTACIONES
					relacionBancoBO.generaPDFRelacionBanco(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaCBancoResultadoImpoExpo(), this.getBusquedaForm(),this.getTotalBancoImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}
	
	public void buscarRelacionBancos(ActionEvent event){
		try {
			if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
						MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
						MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
				return;
			}
			ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("comunController");
			if(comunController.getPaisSeleccionado()!=null){
				this.getBusquedaForm().setStrCodPais(comunController.getPaisSeleccionado().getCodPais());
				this.getBusquedaForm().setStrDescPais(comunController.getPaisSeleccionado().getDescripcion());
			}
			if(comunController.getBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodBanco(comunController.getBancoSeleccionado().getCodBanco());
				this.getBusquedaForm().setStrDescBanco(comunController.getBancoSeleccionado().getDescBanco1());
			}
			if(comunController.getExclusivBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluGrupo(comunController.getExclusivBancoSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluGrupo(comunController.getExclusivBancoSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivBancoClaveSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluClave(comunController.getExclusivBancoClaveSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluClave(comunController.getExclusivBancoClaveSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivAladiSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluOpera(comunController.getExclusivAladiSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluOpera(comunController.getExclusivAladiSeleccionado().getDescripcion());
			}
			BusquedaClienteController busquedaClienteController = (BusquedaClienteController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("busquedaClienteController");
			if(busquedaClienteController.getClienteSeleccionado()!=null){
				this.getBusquedaForm().setStrCodCliente(busquedaClienteController.getClienteSeleccionado().getStrCodCliente());
				this.getBusquedaForm().setClienteDatos(busquedaClienteController.getClienteSeleccionado());
			}
			
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					this.setListaCBancoResultadoImportaciones(relacionBancoBO.getListRankingBancoImport(this.getBusquedaForm()));
					//Importaciones
					subTotalBancoConClaveImp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalBancoSinClaveImp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalBancoImp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					relacionBancoBO.setearTotales(subTotalBancoConClaveImp,subTotalBancoSinClaveImp,totalBancoImp,this.getListaCBancoResultadoImportaciones());
					break;
				case 1://EXPORTACIONES
					this.setListaCBancoResultadoExportaciones(relacionBancoBO.getListRankingBancoExport(this.getBusquedaForm()));
					// Exportaciones
					subTotalBancoConClaveExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalBancoSinClaveExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalBancoExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					relacionBancoBO.setearTotales(subTotalBancoConClaveExp,subTotalBancoSinClaveExp,totalBancoExp,this.getListaCBancoResultadoExportaciones());
					break;
				case 2://IMPORTACIONES Y EXPORTACIONES
					this.setListaCBancoResultadoImpoExpo(relacionBancoBO.getListRankingBancoImpExp(this.getBusquedaForm()));
					// Importaciones-Exportaciones
					subTotalBancoConClaveImpExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalBancoSinClaveImpExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalBancoImpExp = (new ClienteRelacionBancoResultado("", "", "", "",  "",  "",  "", new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					relacionBancoBO.setearTotales(subTotalBancoConClaveImpExp,subTotalBancoSinClaveImpExp,totalBancoImpExp,this.getListaCBancoResultadoImpoExpo());
					break;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}


	public List<ClienteRelacionBancoResultado> getListaCBancoResultadoImportaciones() {
		return listaCBancoResultadoImportaciones;
	}


	public void setListaCBancoResultadoImportaciones(
			List<ClienteRelacionBancoResultado> listaCBancoResultadoImportaciones) {
		this.listaCBancoResultadoImportaciones = listaCBancoResultadoImportaciones;
	}


	public List<ClienteRelacionBancoResultado> getListaCBancoResultadoExportaciones() {
		return listaCBancoResultadoExportaciones;
	}


	public void setListaCBancoResultadoExportaciones(
			List<ClienteRelacionBancoResultado> listaCBancoResultadoExportaciones) {
		this.listaCBancoResultadoExportaciones = listaCBancoResultadoExportaciones;
	}


	public List<ClienteRelacionBancoResultado> getListaCBancoResultadoImpoExpo() {
		return listaCBancoResultadoImpoExpo;
	}


	public void setListaCBancoResultadoImpoExpo(
			List<ClienteRelacionBancoResultado> listaCBancoResultadoImpoExpo) {
		this.listaCBancoResultadoImpoExpo = listaCBancoResultadoImpoExpo;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoConClaveImp() {
		return subTotalBancoConClaveImp;
	}


	public void setSubTotalBancoConClaveImp(
			ClienteRelacionBancoResultado subTotalBancoConClaveImp) {
		this.subTotalBancoConClaveImp = subTotalBancoConClaveImp;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoSinClaveImp() {
		return subTotalBancoSinClaveImp;
	}


	public void setSubTotalBancoSinClaveImp(
			ClienteRelacionBancoResultado subTotalBancoSinClaveImp) {
		this.subTotalBancoSinClaveImp = subTotalBancoSinClaveImp;
	}


	public ClienteRelacionBancoResultado getTotalBancoImp() {
		return totalBancoImp;
	}


	public void setTotalBancoImp(ClienteRelacionBancoResultado totalBancoImp) {
		this.totalBancoImp = totalBancoImp;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoConClaveExp() {
		return subTotalBancoConClaveExp;
	}


	public void setSubTotalBancoConClaveExp(
			ClienteRelacionBancoResultado subTotalBancoConClaveExp) {
		this.subTotalBancoConClaveExp = subTotalBancoConClaveExp;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoSinClaveExp() {
		return subTotalBancoSinClaveExp;
	}


	public void setSubTotalBancoSinClaveExp(
			ClienteRelacionBancoResultado subTotalBancoSinClaveExp) {
		this.subTotalBancoSinClaveExp = subTotalBancoSinClaveExp;
	}


	public ClienteRelacionBancoResultado getTotalBancoExp() {
		return totalBancoExp;
	}


	public void setTotalBancoExp(ClienteRelacionBancoResultado totalBancoExp) {
		this.totalBancoExp = totalBancoExp;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoConClaveImpExp() {
		return subTotalBancoConClaveImpExp;
	}


	public void setSubTotalBancoConClaveImpExp(
			ClienteRelacionBancoResultado subTotalBancoConClaveImpExp) {
		this.subTotalBancoConClaveImpExp = subTotalBancoConClaveImpExp;
	}


	public ClienteRelacionBancoResultado getSubTotalBancoSinClaveImpExp() {
		return subTotalBancoSinClaveImpExp;
	}


	public void setSubTotalBancoSinClaveImpExp(
			ClienteRelacionBancoResultado subTotalBancoSinClaveImpExp) {
		this.subTotalBancoSinClaveImpExp = subTotalBancoSinClaveImpExp;
	}


	public ClienteRelacionBancoResultado getTotalBancoImpExp() {
		return totalBancoImpExp;
	}


	public void setTotalBancoImpExp(ClienteRelacionBancoResultado totalBancoImpExp) {
		this.totalBancoImpExp = totalBancoImpExp;
	}


	public RelacionBancoBusquedaForm getBusquedaForm() {
		return busquedaForm;
	}


	public void setBusquedaForm(RelacionBancoBusquedaForm busquedaForm) {
		this.busquedaForm = busquedaForm;
	}


	public Integer getIdxTabResult() {
		return idxTabResult;
	}


	public void setIdxTabResult(Integer idxTabResult) {
		this.idxTabResult = idxTabResult;
	}




	
}
